﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using UniMana.Utils.Data;
using UniMana.Data;
using DevExpress.XtraTab;
using UniMana.Utils.LoginInfo;
using UniMana.Utils.Helper;

namespace UniMana.Win.Training
{
    public partial class FrmStudent_SubFilter : DevExpress.XtraEditors.XtraForm
    {
        DBMain m_data = new DBMain();
        Dictionary<string, int> dictKeys = new Dictionary<string, int>();
        string nullText = "---Chọn tất cả---";
        public FrmStudent_SubFilter()
        {
            InitializeComponent();
            TaskLoadData();
        }

        #region [Task]

        /// <summary>
        /// Tác vụ nạp dữ liệu ban đầu
        /// </summary>
        public void TaskLoadData()
        {
            //Bậc đào tạo
            lueCatalogue_Level.GetData(m_data.m_DCReadOnly.Catalogue_Levels, nullText: nullText);

            //Loại hình đào tạo
            lueCatalogue_TrainingType.GetData(m_data.m_DCReadOnly.Catalogue_TrainingTypes, nullText: nullText);

            //Khóa học
            lueCatalogue_Course.GetData(m_data.m_DCReadOnly.Catalogue_Courses, nullText: nullText);

            //Đơn vị + Chuyên ngành
            if (GblLoginInfo.iListDepartment.Count ==1)
            {
                lueCatalogue_Department.GetData(m_data.m_DCReadOnly.Catalogue_Departments.Where(p => p.Catalogue_DepartmentKey == GblLoginInfo.iDepartmentKey), nullText: nullText);
                try
                {
                    lueCatalogue_Department.EditValue = GblLoginInfo.iDepartmentKey;
                    lueCatalogue_Department.Enabled = false;
                }
                catch { }
                gluCatalogue_Major.GetData(m_data.m_DCReadOnly.Catalogue_Majors.Where(p => p.Catalogue_DepartmentKey == GblLoginInfo.iDepartmentKey), nullText: nullText);
            }
            else
            {
                var q = from dpt in m_data.m_DCReadOnly.Catalogue_Departments
                        where dpt.StudentManage == true
                        where GblLoginInfo.iListDepartment.Contains(dpt.Catalogue_DepartmentKey)
                        select dpt;
                lueCatalogue_Department.GetData(q, nullText: nullText);
                gluCatalogue_Major.GetData(m_data.m_DCReadOnly.Catalogue_Majors, nullText: nullText);
            }

            //Tình trạng sinh viên
            lueCatalogue_Status.GetData(m_data.m_DCReadOnly.Catalogue_Status, nullText: nullText);

            //Lớp
            lueTraining_Class.GetData(m_data.m_DCReadOnly.Training_Classes, nullText: nullText);
        }

        /// <summary>
        /// Tác vụ lấy danh sách lớp theo các điều kiện cho sẵn
        /// </summary>
        public void TaskGetClass()
        {
            lueTraining_Class.GetData(
            m_data.m_DCReadOnly.Training_Classes.GetClassByRef(lueCatalogue_Department.GetIntValue(),
                                                               lueCatalogue_Level.GetIntValue(),
                                                               lueCatalogue_TrainingType.GetIntValue(),
                                                               lueCatalogue_Course.GetIntValue(),
                                                               gluCatalogue_Major.GetIntValue())
                                                               ,nullText:nullText);
        }

        /// <summary>
        /// Tác vụ trả về công việc sẽ thực hiện
        /// </summary>
        /// <returns>
        /// 0. Không làm gì
        /// 1. Lọc danh sách sinh viên
        /// 2. Lọc danh sách hồ sơ thiếu
        /// 3. Lọc danh sách thiếu thông tin
        /// 4. Lọc môn nợ
        /// </returns>
        public int TaskGetWork()
        {
            if (ckeSearchInfo.Checked)
                return 1;
            if (ckeSearchMissCheckList.Checked)
                return 2;
            if (ckeSearchMissInfo.Checked)
                return 3;
            if (ckeSearchRetestSubject.Checked)
                return 4;

            //default
            return 0;
        }

        /// <summary>
        /// Gọi dữ liệu tương ứng load lên form
        /// </summary>
        /// <param name="i_FormStyle">
        /// 1: Frm DSSV
        /// 2: Frm DS hồ sơ thiếu
        /// 3: Frm DS thiếu thông tin
        /// 4: Frm DS nợ môn
        /// </param>
        public void TaskShowCopatibleForm(int i_FormStyle)
        {
            #region [Info Trans]
            dictKeys.Clear();
            int levelKey = lueCatalogue_Level.GetIntValue();
            dictKeys.Add("LevelKey", levelKey);

            int trainingType = lueCatalogue_TrainingType.GetIntValue();
            dictKeys.Add("TypeKey", trainingType);

            int course = lueCatalogue_Course.GetIntValue();
            dictKeys.Add("CourseKey", course);

            int department = lueCatalogue_Department.GetIntValue();
            dictKeys.Add("DepartmentKey", department);

            int major = gluCatalogue_Major.GetIntValue();
            dictKeys.Add("MajorKey", major);

            int status = lueCatalogue_Status.GetIntValue();
            dictKeys.Add("StatusKey", status);

            int classs = lueTraining_Class.GetIntValue();
            dictKeys.Add("ClassKey", classs);

            string ID = string.Empty;
            string Name = string.Empty;
            if (ckeByID.Checked)
            {
                ID = txtID.Text;
                Name = string.Empty;
            }
            else
            {
                Name = txtID.Text;
                ID = string.Empty;
            }

            #endregion

            #region [Add Tab to form]
            FrmStudent_SubList subForm = new FrmStudent_SubList(dictKeys, ID, Name, i_FormStyle);
            try
            {
                if (((FrmStudent)(((this.Parent).Parent).Parent)).xtcMain.TabPages.Count > 0)
                {
                    ((FrmStudent)(((this.Parent).Parent).Parent)).xtcMain.TabPages.RemoveAt(0);
                }
                TabShowFrm.ShowTabbedMdi(subForm, ((FrmStudent)(((this.Parent).Parent).Parent)).xtcMain);
            }
            catch
            {
                #region [Old]
                try
                {
                    foreach (XtraTabPage p in ((FrmStudent)Application.OpenForms["FrmStudentMain"]).xtcMain.TabPages)
                    {
                        if (p.Text == subForm.Text)
                        {
                            ((FrmStudent)Application.OpenForms["FrmStudentMain"]).xtcMain.TabPages.Remove(p);
                            p.Dispose();
                            break;
                        }
                    }
                }
                catch { }

                TabShowFrm.ShowTabbedMdi(subForm, ((FrmStudent)Application.OpenForms["FrmStudentMain"]).xtcMain);
                #endregion
            }
            #endregion
        }

        #endregion

        #region [Events]

        private void FrmCondition_Load(object sender, EventArgs e)
        {
            this.TaskGetClass();
        }

        #region [Các lookup edit thay đổi thì clear id sinh viên]

        //Bậc đổi thì ngành đổi theo
        private void lueCatalogue_Level_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }

            #region [Ràng buộc]
            //Thay đổi ngành theo bậc tương ứng
            int iLevel = lueCatalogue_Level.GetIntValue();

            if (iLevel != -1)
            {
                var majorSource = m_data.m_DCReadOnly.Catalogue_Majors.Where(p => p.Catalogue_LevelKey == iLevel);
                if (lueCatalogue_Department.GetIntValue() != -1)
                {
                    majorSource = majorSource.Where(p => p.Catalogue_DepartmentKey == lueCatalogue_Department.GetIntValue());
                }
                gluCatalogue_Major.GetData(majorSource, nullText: nullText);
            }
            else   //Nếu bậc đào tạo là null thì lấy hết danh sách ngành tương ứng với đơn vị quản lý
            {
                lueCatalogue_Department_EditValueChanged_1(sender, e);
            }
            if (gluCatalogue_Major.Text == string.Empty) gluCatalogue_Major.EditValue = null;
            #endregion

            this.TaskGetClass();
        }

        private void lueCatalogue_Department_EditValueChanged_1(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }

            #region [Ràng buộc]

            try
            {
                if (gluCatalogue_Major.EditValue == null) lueCatalogue_Level.EditValue = null;
                gluCatalogue_Major.GetData(m_data.m_DCReadOnly.Catalogue_Majors.Where(p => p.Catalogue_DepartmentKey == lueCatalogue_Department.GetIntValue())
                                                                                       , nullText: nullText);
            }
            catch { }
            #endregion
            this.TaskGetClass();
        }

        private void lueCatalogue_TrainingType_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }
            this.TaskGetClass();
        }

        private void lueCatalogue_Course_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }
            this.TaskGetClass();
        }

        private void lueCatalogue_Status_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }

        }

        private void lueCatalogue_Major_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }

            #region [Ràng buộc]
            try
            {
                var item = m_data.m_DCReadOnly.Catalogue_Majors.Where(p => p.Catalogue_MajorKey == gluCatalogue_Major.GetIntValue()).FirstOrDefault();
                lueCatalogue_Level.EditValue = item.Catalogue_LevelKey;  //Bậc đổi
                lueCatalogue_Department.EditValue = item.Catalogue_DepartmentKey; //Đơn vị đổi
            }
            catch { }
            #endregion

            this.TaskGetClass();
        }

        private void lueCatalogue_Department_EditValueChanged(object sender, EventArgs e)
        {
            if (txtID.Text != string.Empty)
            {
                txtID.Text = string.Empty;
            }
        }
        #endregion

        private void txtID_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.TaskShowCopatibleForm(this.TaskGetWork());
            }
        }

        private void btnHelp_Click(object sender, EventArgs e)
        {
            XtraMessageBox.Show("Chức năng đang xây dựng!");
        }

        private void btnView_Click(object sender, EventArgs e)
        {
            this.TaskShowCopatibleForm(this.TaskGetWork());
        }

        #endregion
    }
}